package br.com.diego.system.controller.cadastrousuario;

import br.com.diego.system.entity.usuario.Situacao;
import br.com.diego.system.entity.usuario.Tipo;
import br.com.diego.system.entity.usuario.Usuario;
import br.com.diego.system.manager.usuario.UsuarioManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;

public class CadastroUsuarioBuilder {

    @Autowired
    private UsuarioManager usuarioManager;
    
    @Autowired
    private CadastroUsuarioFactory cadastroUsuarioFactory;
    
    private Usuario usuario;

    public void buildSalvar(CadastroUsuarioVo cadastroUsuarioVo) {
        Assert.notNull(cadastroUsuarioVo, "Não foi possível recuperar os dados da tela.");
        Assert.hasText(cadastroUsuarioVo.getUsuarioVo().getNome(), "Nome é um campo obrigatório.");
        Assert.hasText(cadastroUsuarioVo.getUsuarioVo().getEmail(), "E-mail é um campo obrigatório.");
        Assert.notNull(cadastroUsuarioVo.getUsuarioVo().getTipoVo(), "Tipo é um campo obrigatório.");
        Assert.notNull(cadastroUsuarioVo.getUsuarioVo().getSituacaoVo(), "Situação é um campo obrigatório.");
        Assert.hasText(cadastroUsuarioVo.getConfirmacaoEmail(), "Confirmação de e-mail é um campo obrigatório.");
        Assert.hasText(cadastroUsuarioVo.getUsuarioVo().getSenha(), "Senha é um campo obrigatório.");
        Assert.hasText(cadastroUsuarioVo.getConfirmacaoSenha(), "Confirmação de senha é um campo obrigatório.");
        Assert.isTrue(cadastroUsuarioVo.getUsuarioVo().getEmail().equals(cadastroUsuarioVo.getConfirmacaoEmail()), "Confirmação de e-mail inválida.");
        Assert.isTrue(cadastroUsuarioVo.getUsuarioVo().getSenha().equals(cadastroUsuarioVo.getConfirmacaoSenha()), "Confirmação de senha inválida.");

        usuario = new Usuario();
        
        if (cadastroUsuarioVo.getUsuarioVo().getId() != null) {
            usuario = usuarioManager.buscarPeloId(cadastroUsuarioVo.getUsuarioVo().getId());
            Assert.notNull(usuario.getId(), "Usuário não encontrado no banco de dados.");
            usuario.setVersion(cadastroUsuarioVo.getUsuarioVo().getVersion());
            usuario.setSenha(cadastroUsuarioVo.getUsuarioVo().getSenha());
            Assert.notNull(usuarioManager.verificaSenhaCorreta(usuario), "Senha Incorreta.");        
        }
             
        usuario.setNome(cadastroUsuarioVo.getUsuarioVo().getNome());
        usuario.setEmail(cadastroUsuarioVo.getUsuarioVo().getEmail());
        usuario.setTipo(Tipo.valueOf(cadastroUsuarioVo.getUsuarioVo().getTipoVo().name()));
        usuario.setSituacao(Situacao.valueOf(cadastroUsuarioVo.getUsuarioVo().getSituacaoVo().name()));
        usuario.setSenha(cadastroUsuarioVo.getUsuarioVo().getSenha());
        
        Assert.isNull(usuarioManager.verificaEmailUnico(usuario), "E-mail inválido.");
        
        usuarioManager.salvar(usuario);
    }

    public void buildDeletar(UsuarioVo usuarioVo) {
        Assert.notNull(usuarioVo.getId(), "Usuário não encontrado.");
        usuario = new Usuario();
        usuario = usuarioManager.buscarPeloId(usuarioVo.getId());
        Assert.notNull(usuario.getId(), "Usuário não pertence a base de dados.");
        usuarioManager.deletar(usuario);
    }
}
